package com.seur.web.buscador;

import org.zkoss.zul.Window;
import org.zkoss.zul.Separator;
import org.zkoss.zk.ui.Executions;
import org.apache.log4j.Logger;
import com.seur.ldap.objetos.Entrada;
import com.seur.ldap.objetos.Atributo;
import com.seur.ldap.error.SEURLdapException;
import com.seur.util.ParseadorPantallas;
import com.seur.util.GestorProperties;
import com.seur.util.ComponenteDinamico;
import com.seur.util.Constantes;
import com.seur.error.ExcepcionGeneral;
import com.seur.web.plantillas.AtributoTexto;
import com.seur.web.plantillas.AtributoLista;
import com.seur.web.plantillas.AtributoTextoOculto;
import com.seur.web.plantillas.AtributoListaDoble;
import com.seur.modelo.Persistencia;
import com.seur.modelo.Valor;

import java.util.List;
import java.util.HashMap;
import java.util.ArrayList;

/**
 * User: Diego
 * Date: 05-jun-2009
 * Time: 12:28:59
 */
public class VentanaDetalleResultado extends Window implements PantallaAtributosDinamicos{
    private Logger trazador = Logger.getLogger(this.getClass().getName());
    private Entrada entrada;

    public void actualizar(Entrada entrada){
        this.entrada = entrada;
        this.setVisible(true);
        ParseadorPantallas parser = null;
        try {
            limpiarVentana();
            parser = new ParseadorPantallas(GestorProperties.dameValor("paths.configuracionPantallas"),true);
            List<ComponenteDinamico> componentes = parser.obtenerComponentes(Constantes.VENTANA_DETALLE_RESULTADO);
            pintarDetalle(componentes);
        } catch (ExcepcionGeneral excepcionGeneral) {
            trazador.error(excepcionGeneral.toString());
        } catch (Exception e) {
            trazador.error(e.toString());
        }
    }

    private void limpiarVentana(){
        this.getChildren().clear();
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("mensaje", "Detalle de la entrada"); //TODO poner el mensaje en el constantes
        Executions.createComponents("/zul/plantillas/titulo.zul", this, params); //TODO poner la direccion en el Constantes
        new Separator().setParent(this);
    }

    private void pintarDetalle(List<ComponenteDinamico> componentes){
        for (ComponenteDinamico componente: componentes){
            String[] valores=null;
            try{
                valores= entrada.getAtributoEntrada(componente.getNombre()).getStringValores();
                ArrayList<Valor> valoresDados = new ArrayList<Valor>();
                if (valores!=null){
                    for(String s:valores)
                        valoresDados.add(new Valor(s));
                }
                componente.setValores(valoresDados);
            }catch(Exception e){}//No hay que hacer nada



            if (componente.getTipo()==Constantes.COMPONENTE_ATRIBUTO_TEXTO){
                AtributoTexto at = (AtributoTexto)Executions.createComponents(Constantes.COMPONENTE_ATRIBUTO_TEXTO_FUENTE, this, null);
                at.setComponenteDinamico(componente);
            }else if(componente.getTipo()==Constantes.COMPONENTE_ATRIBUTO_TEXTO_OCULTO){
                AtributoTextoOculto ato = (AtributoTextoOculto)Executions.createComponents(Constantes.COMPONENTE_ATRIBUTO_TEXTO_OCULTO_FUENTE, this, null);
                ato.setComponenteDinamico(componente);
            }else if(componente.getTipo()==Constantes.COMPONENTE_ATRIBUTO_LISTA){
                AtributoLista al = (AtributoLista)Executions.createComponents(Constantes.COMPONENTE_ATRIBUTO_LISTA_FUENTE, this, null);
                al.setComponenteDinamico(componente);
            }else if(componente.getTipo()==Constantes.COMPONENTE_ATRIBUTO_LISTA_DOBLE){
                AtributoListaDoble ald = (AtributoListaDoble)Executions.createComponents(Constantes.COMPONENTE_ATRIBUTO_LISTA_DOBLE_FUENTE, this, null);
                ald.setComponenteDinamico(componente);
            }
            new Separator().setParent(this);
        }
    }


    public void modificarAtributo(String nombreAtributo, String nuevoValor) throws ExcepcionGeneral, SEURLdapException {
        Persistencia.restablecerValorAtributo(entrada.getNombreEntrada(), nombreAtributo, nuevoValor);
    }

    public void eliminarAtributo(String nombreAtributo) throws ExcepcionGeneral, SEURLdapException {        
        Persistencia.eliminarAtributoEntrada(entrada.getNombreEntrada(), nombreAtributo);
    }

    public void eliminarValorAtributo(String nombreAtributo, String valor) throws ExcepcionGeneral, SEURLdapException {
        Persistencia.eliminarValorAtributo(entrada.getNombreEntrada(), nombreAtributo, valor);
    }

    public void anyadirValorAtributo(String nombreAtributo, String valor) throws ExcepcionGeneral, SEURLdapException {
        Persistencia.anyadirValorAtributo(entrada.getNombreEntrada(), nombreAtributo, valor);
    }

    public void modificarClave(String clave) throws ExcepcionGeneral, SEURLdapException {
        Persistencia.modificarClave(entrada.getNombreEntrada(), clave);
    }
}
